package loja.model.estoque;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import loja.model.produto.Produto;

@Entity
@Table(name = "item_estoque")
public class ItemEstoque implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id_item_estoque")
	private Long idItemEstoque;
	@Column(name = "quantidade_estoque")
	private Integer quantidadeEstoque = 0;
	@Column(name = "quantidade_reservada")
	private Integer quantidadeReservada = 0;
	@Column(precision = 10, scale = 4)
	private BigDecimal preco = BigDecimal.ZERO;
	@Column(precision = 10, scale = 4)
	private BigDecimal custo = BigDecimal.ZERO;
	@Column(precision = 10, scale = 4)
	private BigDecimal lucro = BigDecimal.ZERO;
	@Column(name = "preco_compra", precision = 10, scale = 4)
	private BigDecimal precoCompra = BigDecimal.ZERO;
	@Column(unique = true)
	private String local;
	@Temporal(TemporalType.DATE)
	private Calendar vencimento;
	@OneToOne(cascade = CascadeType.ALL)
	private Produto produto;
	@Column(name = "estoque_minimo")
	private Integer estoqueMinimo = 0;
	private boolean estoqueEmFalta;

	public ItemEstoque() {
	}

	public Long getIdItemEstoque() {
		return idItemEstoque;
	}

	public void setIdItemEstoque(Long idItemEstoque) {
		this.idItemEstoque = idItemEstoque;
	}

	public Integer getQuantidadeEstoque() {
		return quantidadeEstoque;
	}

	public void setQuantidadeEstoque(Integer quantidadeEstoque) {
		this.quantidadeEstoque = quantidadeEstoque;
	}

	public Integer getQuantidadeReservada() {
		return quantidadeReservada;
	}

	public void setQuantidadeReservada(Integer quantidadeReservada) {
		this.quantidadeReservada = quantidadeReservada;
	}

	public BigDecimal getPreco() {
		return preco;
	}

	public void setPreco(BigDecimal preco) {
		this.preco = preco;
	}

	public String getLocal() {
		return local;
	}

	public void setLocal(String local) {
		this.local = local;
	}

	public Calendar getVencimento() {
		return vencimento;
	}

	public void setVencimento(Calendar vencimento) {
		this.vencimento = vencimento;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public BigDecimal getCusto() {
		return custo;
	}

	public void setCusto(BigDecimal custo) {
		this.custo = custo;
	}

	public BigDecimal getLucro() {
		return lucro;
	}

	public void setLucro(BigDecimal lucro) {
		this.lucro = lucro;
	}

	public Integer getEstoqueMinimo() {
		return estoqueMinimo;
	}

	public void setEstoqueMinimo(Integer estoqueMinimo) {
		this.estoqueMinimo = estoqueMinimo;
	}

	public BigDecimal getPrecoCompra() {
		return precoCompra;
	}

	public void setPrecoCompra(BigDecimal precoCompra) {
		this.precoCompra = precoCompra;
	}

	public boolean isEstoqueEmFalta() {
		return estoqueEmFalta;
	}

	public void setEstoqueEmFalta(boolean estoqueEmFalta) {
		this.estoqueEmFalta = estoqueEmFalta;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((custo == null) ? 0 : custo.hashCode());
		result = prime * result
				+ ((estoqueMinimo == null) ? 0 : estoqueMinimo.hashCode());
		result = prime * result
				+ ((idItemEstoque == null) ? 0 : idItemEstoque.hashCode());
		result = prime * result + ((local == null) ? 0 : local.hashCode());
		result = prime * result + ((lucro == null) ? 0 : lucro.hashCode());
		result = prime * result + ((preco == null) ? 0 : preco.hashCode());
		result = prime * result
				+ ((precoCompra == null) ? 0 : precoCompra.hashCode());
		result = prime * result + ((produto == null) ? 0 : produto.hashCode());
		result = prime
				* result
				+ ((quantidadeEstoque == null) ? 0 : quantidadeEstoque
						.hashCode());
		result = prime
				* result
				+ ((quantidadeReservada == null) ? 0 : quantidadeReservada
						.hashCode());
		result = prime * result
				+ ((vencimento == null) ? 0 : vencimento.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ItemEstoque other = (ItemEstoque) obj;
		if (custo == null) {
			if (other.custo != null)
				return false;
		} else if (!custo.equals(other.custo))
			return false;
		if (estoqueMinimo == null) {
			if (other.estoqueMinimo != null)
				return false;
		} else if (!estoqueMinimo.equals(other.estoqueMinimo))
			return false;
		if (idItemEstoque == null) {
			if (other.idItemEstoque != null)
				return false;
		} else if (!idItemEstoque.equals(other.idItemEstoque))
			return false;
		if (local == null) {
			if (other.local != null)
				return false;
		} else if (!local.equals(other.local))
			return false;
		if (lucro == null) {
			if (other.lucro != null)
				return false;
		} else if (!lucro.equals(other.lucro))
			return false;
		if (preco == null) {
			if (other.preco != null)
				return false;
		} else if (!preco.equals(other.preco))
			return false;
		if (precoCompra == null) {
			if (other.precoCompra != null)
				return false;
		} else if (!precoCompra.equals(other.precoCompra))
			return false;
		if (produto == null) {
			if (other.produto != null)
				return false;
		} else if (!produto.equals(other.produto))
			return false;
		if (quantidadeEstoque == null) {
			if (other.quantidadeEstoque != null)
				return false;
		} else if (!quantidadeEstoque.equals(other.quantidadeEstoque))
			return false;
		if (quantidadeReservada == null) {
			if (other.quantidadeReservada != null)
				return false;
		} else if (!quantidadeReservada.equals(other.quantidadeReservada))
			return false;
		if (vencimento == null) {
			if (other.vencimento != null)
				return false;
		} else if (!vencimento.equals(other.vencimento))
			return false;
		return true;
	}

}
